package com.xbongbong.pro.statistic.enums;

import com.xbongbong.i18n.util.I18nMessageUtil;
import com.xbongbong.paas.enums.clazz.AggsTypeClass;
import lombok.Getter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 报表类型枚举
 *
 * @author zcp
 * @version v1.0
 * @date 2019/1/11
 * @since v1.0
 */
@Getter
public enum ChartTypeEnum {
    /**
     * 数据查询表
     */
    DATA_QUERY_TABLE(1,"enum.chartType.name.data_query_table",1,"enum.chartType.name.data_query_table.memo"),

    /**
     * 数据统计表
     */
    DATA_STATISTICS_TABLE(2,"enum.chartType.name.data_statistics_table",2,"enum.chartType.name.data_statistics_table.memo"),

    /**
     * 柱形图
     */
    BAR_CHART(3,"enum.chartType.name.bar_chart",3,"enum.chartType.name.bar_chart.memo"),

    /**
     * 折线图
     */
    LINE_CHART(4,"enum.chartType.name.line_chart",3,"enum.chartType.name.line_chart.memo"),

    /**
     * 面积图
     */
    AREA_CHART(5,"enum.chartType.name.area_chart",3,"enum.chartType.name.area_chart.memo"),

    /**
     * 雷达图
     */
    RADAR_CHART(6,"enum.chartType.name.radar_chart",3,"enum.chartType.name.radar_chart.memo"),

    /**
     * 饼图
     */
    PIE_CHART(7,"enum.chartType.name.pie_chart",4,"enum.chartType.name.pie_chart.memo"),

    /**
     * 系统图表类型
     */
    GAUGE(8,"enum.chartType.name.gauge",5,"enum.chartType.name.gauge.memo"),

    // 简报看板专用
    VALUE(9,"enum.chartType.name.value",6,"enum.chartType.name.value.memo"),

    /**
     * 表格
     */
    TABLE(10,"enum.chartType.name.table",7,"enum.chartType.name.table.memo"),

    /**
     * 堆叠条形图
     */
    STACKED_BAR_CHART(11,"enum.chartType.name.stacked_bar_chart",8,"enum.chartType.name.stacked_bar_chart.memo"),

    /**
     * 系统地图
     */
    MAP(12,"enum.chartType.name.map",9,"enum.chartType.name.map.memo"),

    /**
     * 普通漏斗
     */
    FUNNEL_COMMON(13,"enum.chartType.name.funnel_common",10,"enum.chartType.name.funnel_common.memo"),

    /**
     * 复杂漏斗
     */
    FUNNEL_COMPLEX(14,"enum.chartType.name.funnel_complex",11,"enum.chartType.name.funnel_complex.memo"),

    /**
     * pk榜人员/部门排名
     */
    PK(15,"enum.chartType.name.pk",12,"enum.chartType.name.pk.memo"),

    /**
     * 单个（部门/人）完成情况
     */
    PERFORMANCE(16,"enum.chartType.name.performance",13,"enum.chartType.name.performance.memo"),

    /**
     * 注：该类型的app端没有
     * web端目标完成情况默认展示的是各个指标的明细表格
     */
    PERFORMANCE_TABLE(17,"enum.chartType.name.performance_table",14,"enum.chartType.name.performance_table.memo"),

    /**
     * 注：该类型的web端没有
     * 移动端目标完成情况默认展示的是各个指标的汇总仪表盘
     */
    PERFORMANCE_GAUGES(19,"enum.chartType.name.performance_gauges",16,"enum.chartType.name.performance_gauges.memo"),

    /**
     * 多表查询，查询控件
     */
    MULTIPLE_SEARCH(18,"enum.chartType.name.multiple_search",15,"enum.chartType.name.multiple_search.memo"),

    /**
     * 环图和饼图不再相互切换
     */
    PIE_RING(20,"enum.chartType.name.pie_ring",20,"enum.chartType.name.pie_ring.memo"),

    /**
     * 指标图
     */
    TARGET_CHART(21,"enum.chartType.name.target_chart",21,"enum.chartType.name.target_chart.memo"),

    /**
     * 自定义pk图表由创建自定义pk指标时系统生成
     */
    PK_CUSTOM(22,"enum.chartType.name.pk_custom",15,"enum.chartType.name.pk_custom.memo"),

    /**
     * 双轴图
     */
    BIAXIAL_CHART(23,"enum.chartType.name.biaxial_chart",23,"enum.chartType.name.biaxial_chart.memo"),

    /**
     * 副指标指标图
     */
    SECOND_TARGET_CHART(24,"enum.chartType.name.subtitle_target_chart",21,"enum.chartType.name.subtitle_target_chart.memo"),

    MAP_CUSTOM(25,"enum.chartType.name.map_custom",25,"enum.chartType.name.map_custom.memo"),

    FUNNEL(26,"enum.chartType.name.funnel",26,"enum.chartType.name.funnel.memo"),
    /**
     * 自定义目标管理
     */
    CUSTOMER_PERFORMANCE(27,"enum.chartType.name.customer_performance",27,"enum.chartType.name.customer_performance.memo"),
    /**
     * 横向柱形图
     */
    BROADWISE_BAR_CHART(28,"enum.chartType.name.broadwise_bar_chart",3,"enum.chartType.name.broadwise_bar_chart.memo"),
    /**
     * 散点图(气泡图)
     */
    SCATTER_CHART(29,"enum.chartType.name.scatter_chart",29,"enum.chartType.name.scatter_chart.memo")
    ;

    /**
     * 图表类型code值
     */
    private int code;
    /**
     * 图表类型名
     */
    private String name;

    /**
     * 同类可切换
     */
    private int team;

    /**
     * 图表简介
     */
    private String memo;

    ChartTypeEnum(int code, String name,int team,String memo) {
        this.code = code;
        this.name = name;
        this.team = team;
        this.memo = memo;
    }

    /**
     * web端：获取图表类型枚举（排除查询条件类型、排除移动端目标完成情况展现形式）
     * @return java.util.List<java.lang.Integer> 图表类型枚举
     * @author zcp
     * @date 2019/1/25 15:06
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> getChartTypeIn4Web() {
        List<Integer> chartTypeIn = new ArrayList<>();
        for (ChartTypeEnum value: values()){
            if (value == MULTIPLE_SEARCH || value == PERFORMANCE_GAUGES) {
                continue;
            }
            chartTypeIn.add(value.code);
        }
        return chartTypeIn;
    }
    /**
     * app端：获取图表类型枚举（排除查询条件类型、排除web端目标完成情况展现类型）
     * @return java.util.List<java.lang.Integer> 图表类型枚举
     * @author zcp
     * @date 2019/1/30 14:55
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> getChartTypeIn4App(){
        List<Integer> chartTypeIn = new ArrayList<>();
        for (ChartTypeEnum value: values()){
            if (value == PERFORMANCE_TABLE || value == MULTIPLE_SEARCH) {
                continue;
            }
            chartTypeIn.add(value.code);
        }
        return chartTypeIn;
    }

    /**
     * 根据分组获取枚举列表
     * @param team
     * @return
     */
    public static List<AggsTypeClass> getByTeam(Integer team) {
        List<AggsTypeClass> list = new ArrayList<>();
        for (ChartTypeEnum cache : values()) {
            if (Objects.equals(cache.getTeam(),team)) {
                AggsTypeClass aggsTypeClass = new AggsTypeClass();
                aggsTypeClass.setCode(cache.code);
                aggsTypeClass.setName(cache.getName());
                list.add(aggsTypeClass);
            }
        }
        return list;
    }

    /**
     * 获取所有枚举值的code和name
     * @return
     */
    public static List<AggsTypeClass> getAllTeam() {
        List<AggsTypeClass> list = new ArrayList<>();
        for (ChartTypeEnum cache : values()) {
            AggsTypeClass aggsTypeClass = new AggsTypeClass();
            aggsTypeClass.setCode(cache.code);
            aggsTypeClass.setName(cache.getName());
            list.add(aggsTypeClass);
        }
        return list;
    }

    /**
     * 根据code值获取枚举
     * @param code
     * @return
     */
    public static ChartTypeEnum getByCode(Integer code) {
        for (ChartTypeEnum cacheCode : values()) {
            if (Objects.equals(cacheCode.code,code)) {
                return cacheCode;
            }
        }
        return null;
    }
    /**
     * 获取图表中心系统图表的类型
     *
     * @return java.util.List<java.lang.Integer>
     * @author 徐俊杰
     * @date 2019/2/15 13:55
     * @since v1.0
     */
    public static List<Integer> getSystemChartType() {
        List<Integer> types = new ArrayList<>();
        types.add(BAR_CHART.code);
        types.add(LINE_CHART.code);
        types.add(AREA_CHART.code);
        types.add(RADAR_CHART.code);
        types.add(PIE_CHART.code);
        types.add(GAUGE.code);
        types.add(STACKED_BAR_CHART.code);
        types.add(MAP.code);
        types.add(FUNNEL_COMMON.code);
        types.add(FUNNEL_COMPLEX.code);
        types.add(PIE_RING.code);
        return types;
    }

    /**
     * 获取支持同环比排序的图表类型
     * @author 梅伟丁
     * @date 2022/5/24 14:43:38
     * @since v1.0
     */
    public static List<Integer> getChartType4YearChainSortName() {
        List<Integer> types = new ArrayList<>();
        types.add(DATA_STATISTICS_TABLE.code);
        types.add(BAR_CHART.code);
        types.add(LINE_CHART.code);
        types.add(BIAXIAL_CHART.code);
        return types;
    }

    /**
     * 获取图表中心自定义图表的类型
     * @return
     */
    public static List<Integer> getCustomChartType() {
        return Arrays.asList(DATA_QUERY_TABLE.getCode(), DATA_STATISTICS_TABLE.getCode(), BAR_CHART.getCode(), LINE_CHART.getCode(),
                AREA_CHART.getCode(), RADAR_CHART.getCode(), PIE_CHART.getCode(), TARGET_CHART.getCode(), BIAXIAL_CHART.getCode(),
                MAP_CUSTOM.getCode(),FUNNEL.getCode(),BROADWISE_BAR_CHART.getCode(),SCATTER_CHART.getCode());
    }

    public static List<Integer> getGroupChartType() {
        List<Integer> types = new ArrayList<>();
        types.add(DATA_STATISTICS_TABLE.code);
        types.add(BAR_CHART.code);
        types.add(LINE_CHART.code);
        types.add(AREA_CHART.code);
        types.add(RADAR_CHART.code);
        types.add(PIE_CHART.code);
        types.add(TARGET_CHART.code);
        types.add(BIAXIAL_CHART.code);
        types.add(BROADWISE_BAR_CHART.code);
        return types;
    }
    /**
     * 业绩目标类型
     * @param statisticsType 业绩目标类型，系统 还是 自定义 (1为系统，2为自定义)
     * @return java.util.List<java.lang.Integer>
     * @author zcp
     * @date 2019/3/28 9:44
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> getPerformanceChartType(Integer statisticsType) {
        if (Objects.equals(statisticsType, StatisticsTypeEnum.SYSTEM_STATISTIC.getCode())){
            //只获取普通的业绩目标、移动端仪表盘汇总（web端的完成情况不与前两个用同一个接口）
            return Arrays.asList(PERFORMANCE.code);
        } else {
            return Arrays.asList(CUSTOMER_PERFORMANCE.code);
        }
    }

    /**
     * 数据预警支持的类型
     * @return
     */
    public static List<Integer> getDwChartType() {
        return Arrays.asList(DATA_STATISTICS_TABLE.getCode(), BAR_CHART.getCode(), LINE_CHART.getCode(), TARGET_CHART.getCode());
    }

    /**
     *
     * @return
     */
    public static List<Integer> getTypeList(boolean isUltimate){
        if (isUltimate){
            return Arrays.asList(DATA_QUERY_TABLE.getCode(),DATA_STATISTICS_TABLE.getCode(),BAR_CHART.getCode(),LINE_CHART.getCode(),AREA_CHART.getCode(),RADAR_CHART.getCode(),PIE_CHART.getCode(),TARGET_CHART.getCode(),BIAXIAL_CHART.getCode(),MAP_CUSTOM.getCode(),FUNNEL.getCode());
        }else {
            return Arrays.asList(DATA_QUERY_TABLE.getCode(),DATA_STATISTICS_TABLE.getCode(),BAR_CHART.getCode(),LINE_CHART.getCode(),AREA_CHART.getCode(),RADAR_CHART.getCode(),PIE_CHART.getCode(),TARGET_CHART.getCode());
        }
    }

    /**
     *
     * @return
     */
    public static List<ChartTypeEnum> getSpecialType4CK(){
        return Arrays.asList(MAP_CUSTOM,FUNNEL,BROADWISE_BAR_CHART,SCATTER_CHART);
    }

    /**
     * 业绩目标类型
     * @return java.util.List<java.lang.Integer>
     * @author zcp
     * @date 2019/3/28 9:44
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> getPerformanceChartType4List() {
        //只获取普通的业绩目标、移动端仪表盘汇总（web端的完成情况不与前两个用同一个接口）
        return Arrays.asList(PERFORMANCE.code, CUSTOMER_PERFORMANCE.code);
    }

    public String getName() {
        return I18nMessageUtil.getMessage(name);
    }

    public String getMemo(){
        return I18nMessageUtil.getMessage(memo);
    }

    /**
     * 获取普通分类下的图表
     *
     * @return java.util.List<com.xbongbong.pro.statistic.enums.ChartTypeEnum>
     * @author zyy
     * @date 2022/4/14
     * @version v1.0
     */
    public static List<ChartTypeEnum> getOrdinaryChartList(){
        List<ChartTypeEnum> ordinaryChartList = new ArrayList<>();
        ordinaryChartList.add(DATA_QUERY_TABLE);
        ordinaryChartList.add(DATA_STATISTICS_TABLE);
        ordinaryChartList.add(BAR_CHART);
        ordinaryChartList.add(LINE_CHART);
        ordinaryChartList.add(AREA_CHART);
        ordinaryChartList.add(RADAR_CHART);
        ordinaryChartList.add(PIE_CHART);
        ordinaryChartList.add(TARGET_CHART);
        return ordinaryChartList;
    }

    /**
     * 获取高级分类下的图表
     *
     * @return java.util.List<com.xbongbong.pro.statistic.enums.ChartTypeEnum>
     * @author zyy
     * @date 2022/4/14
     * @version v1.0
     */
    public static List<ChartTypeEnum> getSeniorChartList(){
        List<ChartTypeEnum> seniorChartList = new ArrayList<>();
        seniorChartList.add(BIAXIAL_CHART);
        seniorChartList.add(SECOND_TARGET_CHART);
        seniorChartList.add(MAP_CUSTOM);
        seniorChartList.add(FUNNEL);
        seniorChartList.add(BROADWISE_BAR_CHART);
        seniorChartList.add(SCATTER_CHART);
        return seniorChartList;
    }

    /**
     * 获取支持下拉框字段调整顺序的图表类型
     *
     * @return java.util.List<java.lang.Integer>
     * @author zyy
     * @date 2022/8/15
     * @version v1.0
     */
    public static List<Integer> comboChartCodeList(){
        return Arrays.asList(DATA_STATISTICS_TABLE.code,
                BAR_CHART.code,
                LINE_CHART.code,
                AREA_CHART.code,
                RADAR_CHART.code,
                PIE_CHART.code,
                BIAXIAL_CHART.code,
                TARGET_CHART.code,
                BROADWISE_BAR_CHART.code,
                SCATTER_CHART.code);
    }

    /**
     * 自定义图表可以穿透的图表类型
     * @return java.util.List<java.lang.Integer>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> supportThroughChartType(){
        /*
          仅支持穿透的几个：雷达图、双轴图、漏斗图
          同时可以穿透、钻取的：柱形图、折线图、面积图、饼图、横向柱形图、气泡图、数据统计表
         */
        return Arrays.asList(RADAR_CHART.code, BIAXIAL_CHART.code, FUNNEL.code, BAR_CHART.code, LINE_CHART.code, AREA_CHART.code, PIE_CHART.code, BROADWISE_BAR_CHART.code, SCATTER_CHART.code, DATA_STATISTICS_TABLE.code);
    }
    /**
     * 自定义图表可以钻取的图表类型（能在图表展示时钻取、图表交互内有钻取开关<开关还依赖是否拥有钻取权限>）
     * 注：只是有图表交互的图表类型，不是说就有钻取设置，比如地图就无钻取设置，但是它的交互属于钻取
     * @return java.util.List<java.lang.Integer>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> supportDrillChartType(){
        /*
          能钻取交互也能设置：柱形图、折线图、面积图、饼图、横向柱形图、气泡图、数据统计表
          只有钻取交互，无钻取设置：地图 自定义地图（MAP_CUSTOM） 在判断是否有设置的时候单独处理地图
         */
        return Arrays.asList(BAR_CHART.code, LINE_CHART.code, AREA_CHART.code, PIE_CHART.code, BROADWISE_BAR_CHART.code, SCATTER_CHART.code, DATA_STATISTICS_TABLE.code, MAP_CUSTOM.code);
    }

    /**
     * 自定义图表可以联动的图表类型
     *
     * @return java.util.List<java.lang.Integer>
     * @author zyy
     * @since v1.0
     * @version v1.0
     */
    public static List<Integer> supportLinkageChartType(){
        return linkageChartTypeList();
    }

    /**
     * 开启ck、且图表类型支持钻取，则有钻取设置功能
     * 地图类型是一种特殊的钻取类型，默认无钻取设置，但是它的交互当做钻取，开关也通过钻取开关控制
     * @return java.util.List<java.lang.Integer>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    public static boolean supportDrillSet(boolean ckFlag, Integer chartType){
        //未开启ck，则不支持钻取；地图只有钻取交互，但是没有钻取设置
        if (!ckFlag || Objects.equals(MAP_CUSTOM.code, chartType)) {
            return false;
        }
        /*
          支持钻取的图表类型 - 特指可以在图表中心进行图表设计的图表类型有：
          柱形图、折线图、面积图、饼图、横向柱形图、气泡图，及数据统计表
         */
        return supportDrillChartType().contains(chartType);
    }

    /**
     * 联动 的图表类型数组
     * 注意返回的数组未处理时不能进行增删改，只能进行查看操作
     *
     * @return java.util.List<java.lang.Integer>
     * @author zyy
     * @date 2022/11/30
     * @version v1.0
     */
    public static List<Integer> linkageChartTypeList(){
        return Arrays.asList(
                DATA_STATISTICS_TABLE.code,
                //MAP_CUSTOM.code,
                BIAXIAL_CHART.code,
                SCATTER_CHART.code,
                BROADWISE_BAR_CHART.code,
                PIE_CHART.code,
                RADAR_CHART.code,
                AREA_CHART.code,
                LINE_CHART.code,
                BAR_CHART.code
        );
    }

    /**
     * 被联动 图表的图表类型数组
     *
     * @return java.util.List<java.lang.Integer>
     * @author zyy
     * @date 2022/11/30
     * @version v1.0
     */
    public static List<Integer> linkedChartTypeList(){
        return Arrays.asList(
                DATA_QUERY_TABLE.code,
                DATA_STATISTICS_TABLE.code,
                BAR_CHART.code,
                LINE_CHART.code,
                AREA_CHART.code,
                RADAR_CHART.code,
                PIE_CHART.code,
                TARGET_CHART.code,
                SECOND_TARGET_CHART.code,
                BROADWISE_BAR_CHART.code,
                MAP_CUSTOM.code,
                BIAXIAL_CHART.code,
                SCATTER_CHART.code,
                FUNNEL.code
        );
    }


    /**
     * 放开聚合的图表类型
     *
     * @return boolean
     * @author zyy
     * @date 2022/12/20
     * @version v1.0
     */
    public static boolean supportAggType(Integer chartType){
        return Arrays.asList(DATA_STATISTICS_TABLE.code,TARGET_CHART.code).contains(chartType);
    }
}
